\documentclass[a4paper,10pt]{article} 
%Defino el tipo de hoja, el tama\~no de la letra b\'asico y el tipo de proyecto(en general no importa mucho esto \'ultimo)


\usepackage[left=2cm,right=2cm,top=3cm,bottom=1cm,includefoot,head=1.5cm]{geometry} %m\'argenes

%tipo de letra con que escribir y habilito las letras de c\'alculos
\usepackage[latin1]{inputenc}
\usepackage{amsmath}
\usepackage[spanish]{babel}
\usepackage{fontenc}

%para cargar im\'agenes
\usepackage{graphicx}
\usepackage[unicode]{hyperref}

\usepackage{lastpage}

%boludeces para que quede m\'as lindo
\usepackage{fancyhdr} 
\pagestyle{fancy}


%un comando que uso en mi portada expecifica
\newcommand{\HRule}{\rule{\linewidth}{0.5mm}}

%Esto mucho no importa, porque no agrego la portada default de LateX
\title{Informe TP1}
\author{Grupo_Alpha}

%Empiezo el documento en si
\begin{document}

%aca inserto mi portada personal
\input{./title.tex}

\newpage

%esto crea el \'indice del tp
\tableofcontents

\newpage

%Bueno los ducumentos se dividen en section, subsection, subsubsection y creo que hay m\'as, pero es muy poco probable usarlos

\section{Introducci\'on y Objetivos}
El objetivo de este primer trabajo pr\'actico es familiarizarse con las herramientas de software que ser\'an usadas en los siguientes
trabajos pr\'acticos, implementando una version minimalista del comando join de UNIX.
\section{Explicaci\'on Del Programa}
El programa realizado en lenguaje C es una version minimalista del comando join de UNIX, basada en el comando dc de UNIX. \\
El programa consta con los siguientes comandos:

\begin{table}[ht]
\centering
\begin{tabular}{cccc}
\textbf{Comando} & \textbf{Descripci\'on}\\
\hline
-v / --version & Imprime la versi\'on del programa \\
-h / --help & Imprime la ayuda \\
-i / --ignore-case & Ignora las diferencias entre may\'usculas y min\'usculas al comparar los campos\\

\hline
\end{tabular}
\caption{Tabla de comandos}
\label{table:Tabla1}
\end{table}

\subsection{Dise\~no}
\subsubsection{main}
En el archivo main, fue colocado todo el parseo de opciones del programa, el cual fue hecho a atrav\'es de la librer\'ia \textit{getopt}. Esta librer\'ia nos permite un f\'acil manejo de los argumentos pasados al programa, para esto debemos definir:


\begin{center}
\begin{verbatim}
	static struct option longopts[] = {
			{ "version",		no_argument, 	NULL, 'v' },
			{ "help", 			no_argument, 	NULL, 'h' },
			{ "ignore-case",	no_argument, 	NULL, 'i' },
			{ NULL, 			0, 				NULL, 0 }
	};
\end{verbatim} 
\end{center}

Aqu\'i se definen los equivalentes de argumentos largos a argumentos cortos. Es decir, si recibe un \textit{version}, se tomar\'a como si hubiera recibido un \textit{V}. Adem\'as se puede configurar si el par\'ametro requiere un argumento o no.

Una vez hecho esto, se debe declarar un char, el cual contendr\'a la opci\'on procesada en el momento y al terminar de procesar todos los argumentos, valdr\'a -1. Para cargar una nueva opci\'on para analizar, se deber\'a hacer:

\begin{verbatim}
 ch = getopt_long(argc, argv, "ivh", longopts, NULL)
\end{verbatim} 

Esta funci\'on devuelve el par\'ametro analizado actualmente que est\'e definido en el string pasado como argumento, en este caso: \textit{f:pnvcdrVhe:}. Notar que los par\'ametros con :, quieren decir que adem\'as deber\'an recibir un segundo argumento como dato (estos datos secundarios se guardan en la variable optarg).
Al tener todo configurado, se podr\'a hacer un loop que verifique todos los comandos usados y lso procese, hasta que c sea igual a -1.


\subsubsection{Ignore-Case y case-sensitive}
La funci\'on que realiza el merge entre archivos se llama merge y recibe tres par\'ametros que son los dos punteros a archivos fuente y un flag llamado caseSensitive, que dice si es un join case-sensitive o no.

\begin{verbatim}
  void merge(FILE* pFile1, FILE* pFile2, int caseSensitive)
\end{verbatim}

Casos posibles:
\newline
1)En caso de que haya claves repetidas en cualquiera de los dos (o en los dos simultaneamente), emite un mensaje de error.\newline
2)Si alguna de las claves del Maestro falta en el de Alctualizaciones, emite un mensaje de error.\newline
3)Si el archivo de actualizaciones esta desordendado, emite un mensaje de error.

El ciclo empieza leyendo el primer archivo, corroborando que no se haya producido errores de lectura. Si esto \'ultimo ocurriese, emite un mensaje de error. Lee una l\'inea del archivo 2, si se produjo un error de lectura emite error un mensaje que describe lo ocurrido. El siguiente paso es corroborar que las l\'ineas le\'idas tengan un campo clave, que es separado por un espacio en blanco. En caso de no tener un espacio en blanco, o sea, la l\'inea no contiene espacios, emite un mensaje de error.

Se procede a extraer los campos clave para su comparaci\'on. Se pregunta por el valor del flag `caseSensitive' para comparar las claves como corresponda. Posteriormente, se procede a guardar en memoria din\'amica el tama\'no de \texttt{$LARGO\_BUFFER\_ARCHIVOS * sizeof(char)$} para equilibrar el tama\~no del stack. Si las claves resultan ser iguales se procede a extraer el resto de las l\'ineas, y unificarlas en una sola para despu\'es imprimirlas por pantalla. En caso de que las claves no coincidieran se muestra un mensaje de error. Se libera la memoria pedida y el ciclo termina. Volviendo a empezar el ciclo nuevamente. En cualquier caso de error el ciclo se interrumpe.


\section{Proceso de Compilaci\'on}
Para compilar el programa, se utiliz\'o la siguiente instrucci\'on:

gcc -o tp0 -g tp0.c merger.c

\begin {center}
\includegraphics[width=0.5\textwidth]{Compi.png}
\end {center}
 

Para compilar el c\'odigo assembler, se utiliz\'o la instrucci\'on:


gcc -O0 -S -mrnames tp0.c merger.c 
\begin {center}
\includegraphics[width=0.5\textwidth]{assemb.png}
\end {center}


\section{Corridas de prueba}

A continuaci\'on se detallan las diferentes pruebas realizadas:
\newline
Entrada con archivos de prueba - Case-sensitive:
\begin {center}
\includegraphics[width=0.5\textwidth]{Ej_con_archs.png}
\end {center}

Entrada con archivos de prueba - Ignore-case:
\begin {center}
\includegraphics[width=0.5\textwidth]{Archs_case_ign.png}
\end {center}

Entrada con case-sensitive y stdin:
\begin {center}
\includegraphics[width=0.5\textwidth]{case-sens.png}
\end {center}

Entrada con ignore-case y stdin:
\begin {center}
\includegraphics[width=0.5\textwidth]{case-ign.png}
\end {center}



\end{document}
